package perfeccion;

/**
 *
 * @author Daniel
 */
public class Tablero {

    //ATRIBUTOS
    private Ficha tablero[][];

    //GETTERS AND SETTERS
    public Ficha[][] getTablero() {
        return tablero;
    }

    public void setTablero(Ficha[][] unTablero) {
        this.tablero = unTablero;
    }

    //CONTRUCTORES
    public Tablero(Ficha[][] unTablero) {
        this.tablero = unTablero;

        Ficha fichaVacia = new Ficha("   ");

        for (int i = 0; i < tablero.length; i++) {
            for (int j = 0; j < tablero[0].length; j++) {
                tablero[i][j] = fichaVacia;
            }
        }
    }

    public Tablero() {
    }

    //METODOS
    public Ficha getFicha(int fila, int columna) {
        return this.getTablero()[fila][columna];
    }

    public void setFicha(Ficha unaFicha, int fila, int columna) {
        this.tablero[fila][columna] = unaFicha;
    }

    //Metodo definido para mostrar el tablero de acuerdo a las especificaciones.
    public String toString(boolean estaPanel, Ficha unPanel[][], int xPan, int yPan) {
        String matrix = "";
        int filyCol = tablero.length, i, j;
        int filyColPan = unPanel.length;
        int contFil=0, contCol=0;

        //Imprimo el tablero resultante la guia de columnas
        for (i = 1; i < filyCol + 1; i++) {
            if (i == 1) {
                System.out.print("      " + i);
            } else {
                System.out.print("     " + i);
            }
        }
        System.out.println();
        
        //Defino dos procesos diferentes de toString, uno para cuando el panel
        //esta colocado y otro para cuando no esta el panel en el tablero.
        //La primera parte sin el panel en el tablero
        if (!estaPanel) {
            for (i = 0; i < (filyCol * 2) + 1; i++) {
                if (esPar(i)) {
                    System.out.print("  ");
                    for (j = 0; j < (filyCol * 2) + 1; j++) {
                        if (esPar(j)) {
                            System.out.print(" + ");
                        } else {
                            System.out.print(" - ");
                        }
                    }
                    System.out.println();
                } else {
                    System.out.print(devolucionDeTipo(i) + "  |");
                    for (j = 0; j < (filyCol * 2); j++) {
                        if (esPar(j)) {
                            if (j == 0) {
                                System.out.print(" " + tablero[(i-((i/2)+1))][j]);
                            } else {
                                System.out.print(" " + tablero[i-((i/2)+1)][j-((j/2))]);
                            }
                        } else {                            
                            System.out.print(" |");
                        }
                    }            
                    System.out.println();
                }
            }
        } else {
            for (i = 0; i < (filyCol * 2) + 1; i++) {                
                if (esPar(i)) {
                    System.out.print("  ");                    
                    for (j = 0; j < (filyCol * 2) + 1; j++) {
                        if( (i >= (xPan-1)*2) && (i <= (xPan*2-1)+filyColPan*2) && ( j >= (yPan-1)*2 ) && (j <= (yPan*2-2)+filyColPan*2)){
                            System.out.print(" # ");                            
                        } else {
                            if (esPar(j)) {
                                System.out.print(" + ");
                            } else {
                                System.out.print(" - ");
                            }
                        }                        
                    }
                    System.out.println();
                } else {
                    System.out.print(devolucionDeTipo(i));
                    for (j = 0; j < (filyCol * 2); j++) {
                        if ((i >= (xPan - 1) * 2) && (i <= ((xPan-1) *2) + filyColPan * 2) && (j >= (yPan-1)*2-1) && (j<=((yPan-1) *2-1) + filyColPan * 2)) {
                            if (esPar(j)) {
                                if (j == 0) {
                                    System.out.print("  # " + unPanel[contFil][contCol]);
                                    contCol++;
                                    if(contCol==filyColPan-1){
                                        contFil++;
                                    }
                                } else {
                                    System.out.print(" " + unPanel[contFil][contCol]);
                                    contCol++;
                                    if (contCol == filyColPan) {
                                        contFil++;
                                        contCol=0;
                                    }
                                }
                            } else {
                                System.out.print(" #");
                            }
                        } else {
                            if (esPar(j)) {
                                if (j == 0) {
                                    System.out.print("  | " + tablero[(i - ((i / 2) + 1))][j]);
                                } else {
                                    System.out.print(" " + tablero[i - ((i / 2) + 1)][j - ((j / 2))]);
                                }
                            } else {
                                System.out.print(" |");
                            }
                        }

                    }                    
                    System.out.println();
                }
            }
        }
        return matrix;
    }

    //Metodo utilizado en el toSting para imprimir el tablero de acuerdo a las especificaciones de la letra, 
    //con A,B,C ... como indices de las columnas
    public static String devolucionDeTipo(int unIndice) {
        String indice = "";
        switch (unIndice) {
            case 1:
                indice = "A";
                break;
            case 3:
                indice = "B";
                break;
            case 5:
                indice = "C";
                break;
            case 7:
                indice = "D";
                break;
            case 9:
                indice = "E";
                break;
            case 11:
                indice = "F";
                break;
            case 13:
                indice = "G";
                break;
            case 15:
                indice = "H";
                break;
        }
        return indice;
    }

    //Metodo auxiliar utilizado para saber si un numero entero es par
    public static boolean esPar(int x) {
        if ((x % 2) == 0) {
            return true;
        }
        return false;
    }
}
